package com.example.bourse.core.utils;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.Date;

/**
 * @author wangzhiqi
 * @version 1.0
 * @description: 时间工具类
 * @date 2025/1/9 12:17
 */

public class DateUtils {

    /**
     * 将毫秒数转换为Date日期。
     * 
     * @param millis 毫秒数
     * @return 转换后的Date日期
     */
    public static Date convertMillisToDate(long millis) {
        return new Date(millis);
    }

    // 默认日期格式
    public static final String DATE = "yyyy-MM-dd";
    // 默认日期时间格式
    public static final String DATETIME = "yyyy-MM-dd HH:mm:ss";

    /**
     * 将字符串转换为 Date 对象
     *
     * @param dateStr 日期字符串
     * @param format  日期格式
     * @return Date 对象
     */
    public static Date stringToDate(String dateStr, String format) {
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern(format);
        LocalDate localDate = LocalDate.parse(dateStr, formatter);
        return Date.from(localDate.atStartOfDay(ZoneId.systemDefault()).toInstant());
    }

    /**
     * 将 Date 对象转换为字符串
     *
     * @param date   Date 对象
     * @param format 日期格式
     * @return 日期字符串
     */
    public static String dateToString(Date date, String format) {
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern(format);
        LocalDateTime localDateTime = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
        return localDateTime.format(formatter);
    }

    /**
     * 获取当前时间
     *
     * @return 当前时间的 Date 对象
     */
    public static Date getCurrentDate() {
        return new Date();
    }

    /**
     * 添加一天时间
     *
     * @param date Date 对象
     * @return 添加一天后的 Date 对象
     */
    public static Date addOneDay(Date date) {
        LocalDateTime localDateTime = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
        LocalDateTime nextDay = localDateTime.plusDays(1);
        return Date.from(nextDay.atZone(ZoneId.systemDefault()).toInstant());
    }

    /**
     * 后退一天时间
     *
     * @param date Date 对象
     * @return 后退一天后的 Date 对象
     */
    public static Date minusOneDay(Date date) {
        LocalDateTime localDateTime = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
        LocalDateTime previousDay = localDateTime.minusDays(1);
        return Date.from(previousDay.atZone(ZoneId.systemDefault()).toInstant());
    }

    /**
     * 比较两个日期是否相等
     *
     * @param date1 第一个日期
     * @param date2 第二个日期
     * @return 如果相等返回 true，否则返回 false
     */
    public static boolean isSameDay(Date date1, Date date2) {
        LocalDate localDate1 = date1.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
        LocalDate localDate2 = date2.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
        return localDate1.isEqual(localDate2);
    }

    /**
     * 比较两个日期的先后顺序
     *
     * @param date1 第一个日期
     * @param date2 第二个日期
     * @return 如果 date1 在 date2 之前返回 -1，相等返回 0，之后返回 1
     */
    public static int compareDate(Date date1, Date date2) {
        LocalDate localDate1 = date1.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
        LocalDate localDate2 = date2.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
        return localDate1.compareTo(localDate2);
    }

    public static void main(String[] args) {
        // 示例用法
        Date now = getCurrentDate();
        System.out.println("当前时间: " + dateToString(now, DATETIME));

        Date tomorrow = addOneDay(now);
        System.out.println("添加一天后: " + dateToString(tomorrow, DATETIME));

        Date yesterday = minusOneDay(now);
        System.out.println("后退一天后: " + dateToString(yesterday, DATETIME));

        String dateStr = "2023-10-01";
        Date date = stringToDate(dateStr, DATE);
        System.out.println("字符串转 Date: " + date);

        System.out.println("比较日期是否相等: " + isSameDay(now, tomorrow));
        System.out.println("比较日期先后顺序: " + compareDate(now, tomorrow));
    }
}
